#python基本数据类型有哪些：
#int float complex str bool Nonetype list列表 tuple元组 dict字典 set集合
# 最后四种常考

#python容器类型：
# python内置的数据结构，可以存放多个数据
# str list tuple dict set
#
# 列表特点：
# 有序项目集合
# 可以存放任何数据类型
# 可变数据类型

# print(ord("a"))#ascll码
# print("三".encode("utf-8"))
# print("三".encode("gbk"))
#

#从键盘输入一串字符串，取出里面的整数、小写字母、大写字母，统计出其中出现次数最多的字符
#从键盘接受用户输入的用户名和密码，用户名为root、密码为123456 提示登录成功。
# 否则请重试，有3次重试机会，3次重试机会都用完了，提示登录失败

# str1=input("please input str:")
# temp_str=""
# for char in str1:
#     if '0'<=char<='9' or 'a'<=char <= 'z'or 'A'<= char <='Z':
#         temp_str+=char
# max_num = 0
# max_str = ""
# for i in temp_str:
#     num = temp_str.count(i)
#     if num >= max_num:
#         max_num= num
#         max_str = i
# print(temp_str)
# print(f"出现最多的字符是{i}，出现的次数是{max_num}")



# 自己编写的建议版本,这个没有加三次重试的条件约束
# num1 = input("please input 用户名:")
# if num1 == "root":
#     num2 = input("please input 密码:")
#     if num2 == "123456":
#         print("登陆成功")
#     else:
#         print("登陆失败")
# else:
#     print("登陆失败")



#从键盘接受用户输入的用户名和密码，用户名为root、密码为123456 提示登录成功。
# 否则请重试，有3次重试机会，3次重试机会都用完了，提示登录失败

# 下面是自己编写的，到后面就不会做了 看看参考答案
# num1 = input("请输入用户名：")
# count = 0
# try:
#     while num1 ==("root")&count<=3:
#         num2 = input("请输入密码：")
#         while num2 == "123456" &count<=3:
#             print("登录成功")
#         else:
#             count+=1
#             continue
# except :
#     print("你输入的用户名有误！")


# 从键盘接受用户输入的用户名和密码，用户名为root、密码为123456提示登录成功。
# 否则请重试，有3次重试机会，3次重试机会都用完了，提示登录失败
#这个可以用于商品管理系统的开发的登录页面
# num1 = input("请输入用户名: ")
# count = 0
#
# try:
#     while count < 3:
#         if num1 == "root":
#             num2 = input("请输入密码: ")
#             if num2 == "123456":
#                 print("登录成功")
#                 break
#             else:
#                 print("密码错误，请重新输入")
#                 count += 1
#         else:
#             print("用户名错误，请重新输入")
#             num1 = input("请输入用户名: ")
#             count += 1
#     else:
#         print("登录失败，已达到最大尝试次数")
#
# except Exception as e:
#     print(f"发生错误: {e}")
#


#从键盘输入一串字符串，取出里面的整数、小写字母、大写字母，统计出其中出现次数最多的字符
#不用python自带的函数，自己编写方法怎么做？
# str = input("请输入一串字符串：")
# max_char = ""
# max=0
# tem = ""
# for i in str:
#     if i not in tem:
#         tem+=i#去重
#     for j in tem:
#         sum = 0
#         for k in str:
#             if j == k :
#                 sum+=1
#         if sum >=max :
#             max = sum
#             max_char=j
# print(tem)
# print(f"出现最多的字符是{max_char},出现的次数是{max}")



#关于异常捕获部分的with open怎么用，有什么作用，ai给出解答：

# try:
#     # 使用 with open 打开文件
#     with open("example.txt", "r") as file:
#         content = file.read()
#         print("文件内容如下：")
#         print(content)
#
# except FileNotFoundError:
#     # 如果文件不存在，捕获 FileNotFoundError 异常
#     print("错误：文件未找到！请检查文件路径是否正确。")
#
# except PermissionError:
#     # 如果没有权限读取文件，捕获 PermissionError 异常
#     print("错误：没有权限读取该文件！请检查文件权限。")
#
# except Exception as e:
#     # 捕获其他所有异常
#     print(f"发生未知错误: {e}")
#
# finally:
#     # 可选：无论是否发生异常，都会执行的代码块
#     print("文件操作完成。")


# 作用：
# with open:
# open("example.txt", "r")：打开一个名为 example.txt 的文件，模式为只读（"r"）。
# with 确保文件在操作完成后自动关闭，无需手动调用 file.close()。
#


# python容器函数，list tuple dict set

# 列表list特点：
# 有序项目集合
# 可以存放任何数据类型
# 可变数据类型

# list 既是数据类型，又是类型转换函数
# list = list("acas")#可迭代对象可以转换，，即能被for循环遍历的，
# list= list("100")这个不能，
# list = list("range(100)")而这个可以

# list=[12,3,5,4,8]
# print(list[0])
# print(list[2])
# print(list[-1])
# 12
# 5
# 8
# 截取lst[start:end:step]  stat,end,step 每个部分都可以省略
#特别注意，左闭右开
# step默认为1

# 先确定step为正还是为负
# 为正  从前往后去截取
# 为负  从后往前去截取
#
# 再确定start和end的位置，start在截取方向上要在end的前面
# 最后确定step的长度
# list=[12,3,5,4,8]
# print(list[:3])#从下标为0开始取，取到下标为3的元素，但是记住规则是左闭右开，
# # 右边是开区间，所以最右边的数取不到
# print(list[4:])#从下标为4开始取，取到最后一个元素
# print(list[4:2:-1])#方向改变就是左开右闭，可以理解为方向指向的终点的那个值取不到

#可变数据类型和不可变数据类型
#判断方法就是能否在原空间地址修改值

# 列表的属性使用
# lst=["abc",123]
# print(dir(lst))
# lst.append(100)#追加函数
# print(lst)
# lst.insert(1,"xxx")
# print(lst)
# lst2=["dasd","dasdwda"]
# lst.extend(lst2)#这个extend方法就是将可迭代对象lst2的元素值放入lst里面来
# # ，必须是可迭代对象，扩展方法
# print(lst)
#
# lst.remove("abc")#删除方法
# print(lst)
# #如果有重复的元素，怎么删除？
# 默认只删除第一个

# lst=["abc",123,"abc"]
# lst.remove("abc")#删除方法
# print(lst)
# # [123, 'abc']运行结果
#

# lst.pop(3)#删除的是第三个元素，并且它还会将删除的值返回
# print(lst)
# result = lst.pop(3)#这里将返回值赋值给result
# print(f"lst:{lst},删除的是：{result}")

#
# lst=[1,2,3,54,4,'xyz']
# lst=[1,2,3,54,4]
# print(len(lst))
# print(lst.count("xyz"))
# print(lst.index("xyz"))
# lst.reverse()#逆序排列
# print(lst)

# lst.sort()#直接正序排列，但注意排序只能同一种数据类型排列，不同数据类型排序是不行的，会报错
# print(lst)

# lst1=[1,2,3,4,5]
# print(lst1)
# lst2=lst1
# print(lst2)这里是将lst1的地址值赋值给了lst2，所以lst1的内容改变的时候lst2也会改变

#用.copy()方法就能解决上述问题
#两种复制方式
# 第二种就是直接用切片的方法，去头去尾代表全切
# lst3=lst[:]
# print(lst3)
# lst.remove(3)
# print(lst3)

# lst2=lst1.copy()
# print(lst2)
# lst1.remove(3)
# print(lst1)
# print(lst1)
# print(lst2)

#成员关系判断

# lst=[1,2,3,54,4]
# print(100 in lst)
#
# for i in lst:
#     print(f"获取列表元素：{i}")
#
# for k ,v in enumerate(lst):
#     print(f"获取列表元素：{k}-->{v}")


# 约瑟夫船问题
#有一条船，船上30个人，船超载，最多只能容纳20个人。
#给每个人一个编号，排成一排，数到第8个下去。请输出最后下去哪些人。
# mem_lst = list (range(1,31))
# print(mem_lst)
# down_list=[]
# while len(mem_lst)>20:
#     count = 0
#     while count<7:
#         p = mem_lst.pop(0)
#         mem_lst.append(p)
#         count+=1
#     down_list.append(mem_lst.pop(0))
# print(down_list)
#

#元组
# 特点:
# 有序项目集合
# 可以存放任何数据类型
# 不可变数据类型

# t1=()
# t2=tuple("abc")
# t3=(1,)#元组中只有一个元素，定义的时候要加逗号
# print(type(t1),type(t2))
# print(t2)
# print(t3)
# print(t1)

# t4 = (1,"abc", 4.0, False, "xyz")
#
# print(t4[4])#输出下标为4的值
#
# t4[4]="xxx"#不可变数据类型，这条命令不起作用，会报错
# print(t4[4])
#
# 虽说元组是不可变数据类型，但元组包含可变数据类型，那其中的可变数据类型就是可以修改的
# 如下：
# t5=(1, "abc", [100, 200])
# print(t5[2])
# t5[2].append(300)
# print(t5)

# ====================

# dict字典
# 字典是可变数据类型
# k，v存储的键值映射数据结构
# key必须是可hash对象，天生去重（key必须是不可变数据类型）


# d1={"name":"sc","age":20}
# d2={"jay":['晴天','七里香'],
#     "梁静茹":['勇气','分手快乐'],
#     'jay':["发如雪","青花瓷"]}
# # print(d2)
# print(d1["name"])
# print(d1.get("sex","男"))#用get方法的作用是在没有sex这个key的时候也不会报错，
# # 还可以指定默认值"男"
#
# print(d2["jay"])
# d3={1:2,(2,4):6}
# print(d3[(2,4)])
#
#
# #key存在的话就是修改，不存在就是新增
# d2['jay']=['爱在西元前','搁浅']
# print(d2)
#

#判断成员关系
# print('jay'in d2)
# print('name' in d1)
# print(d1.values())#values()方法是输出所以的value值，不会输出key值
#
# print('sc'in d1.values())#判断sc是不是在value里
#
# #最好用get取获取值，因为不会报错，就算不存在也会指定默认值

# str1="aaabbbbcaabada"
# count = {}
# for i in str1:
#     if i in count:
#         count[i]+=1
#     else:
#         count[i]=1
#     count[i] = count.get(i,0)+1
# print(count)

# d1 = {"name":"sc","age":18}
# d2 = {"class":"sanrenxing"}
# d1.update(d2)#将字典dict2里面的值加入到dict1里面去
# print(d1)

#遍历
# for k in d1:  #只遍历key值
#     print(f'key :{k},value is {d1.get(k)}')
#
# for k,v in d1.items():       #k,v一起遍历，更方便
#     print(f"key:{k},value:{v}")

#商品管理系统的开发
#1、商品添加   商品已存在，提示不能添加
#    名字：苹果  价格：5   库存：200
#2、查看商品   商品不存在？  按名字查看
#3、删除商品   按名字删除
#4、修改商品   按名字修改， 价格和库存
#5、退出
#可以不限次数输入















